Przykad 9.4. Rekurencyjne konstruowanie kd-drzewa zrwnowaonego
public class KDFactory {
   // Znane komparatory do dzielenia punktw wzdu osi wymiarw
   private static Comparator<IMultiPoint> comparators[];

   // Buduj rekurencyjnie kd-drzewo, stosujc do punktw wejciowych
   // metod mediany
   public static KDTree generate (IMultiPoint[] points) {
      if (points.length == 0) { return null; }

   // Mediana bdzie korzeniem
   int maxD = points[0].dimensionality();
   KDTree tree = new KDTree(maxD);

   // Utwrz komparatory wymiarowe, ktre porwnuj punkty wedug i-tego wymiaru
   comparators = new Comparator[maxD+1];
   for (int i = 1; i <= maxD; i++) {
      comparators[i] = new DimensionalComparators(i);
   }
   tree.setRoot(generate(1, maxD, points, 0, points.length-1));
   return tree;
}

// Generuj wze d-tego wymiaru (1 <= d <= maxD) dla punktw [left, right]
private static DimensionalNode generate (int d, int maxD,
                                         IMultiPoint points[],
                                         int left, int right) {
   // Zajmij si najpierw atwymi przypadkami
   if (right < left) { return null; }
   if (right == left) { return new DimensionalNode (d, points[left]); }

   // Tak uporzdkuj tablic[left, right], eby element m by median,
   // a wszystkie elementy wczeniejsze od niego byy <=, cho nie musz
   // by posortowane; podobnie, wszystkie elementy po nim bd >=
   int m = 1+(right-left)/2;
   Selection.select(points, m, left, right, comparators[d]);

   // Punkt mediany w tym wymiarze staje si rodzicem
   DimensionalNode dm = new DimensionalNode (d, points[left+m-1]);

   // Uaktualnij na nastpny wymiar lub ustaw z powrotem na 1
   if (++d > maxD) { d = 1; }

   // Oblicz rekurencyjnie lewe i prawe poddrzewa, co w n-wymiarach
   // przekada si na poniej" i "powyej"
   dm.setBelow(maxD, generate(d, maxD, points, left, left+m-2));
   dm.setAbove(maxD, generate(d, maxD, points, left+m, right));
   return dm;
   }
}
